package day06;

import java.util.ArrayList;
import java.util.Arrays;

/*
@Author: 王少杰
@Date: 2025/1/6
@Time: 9:01
@FileName: Demo01.java
@描述:

*/
public class Demo01 {
    public static void main(String[] args) {
        //使用边界值、等价类的方式设计
        System.out.println(oct2dec("77777"));//长度最大值

        System.out.println(oct2dec(""));//无效等价类

        System.out.println(oct2dec("0"));//长度最小值

        System.out.println(oct2dec("+7777"));

        System.out.println(oct2dec("-7777"));

        System.out.println(oct2dec("8787"));//非法八进制数字

        System.out.println(oct2dec(null));//空值

        System.out.println(oct2dec("123456"));//范围内的值

        System.out.println("1234567");//超过长度的

        int[] nums = {1,3,5,6};
        int n = 6;
        int[] mnums = missingNumbers(nums, n);
        System.out.println(Arrays.toString(mnums));
    }

    public static int oct2dec(String oct) {
        if (oct == null) {
            System.out.println("输入的值为空");
            return 9999999;//返回一个错误码
        }
        if (oct.isEmpty() || oct.length() > 5) {
            System.out.println("输入的八进制值长度不正确");
            return 9999999;
        }
        try {
            return Integer.parseInt(oct, 8);
        }
        catch (NumberFormatException e) {
            System.out.println("非法的八进制数组");
            return 9999999;
        }
    }

    /*
从 1 到 n 范围内缺失的数字。具体来说，它通过给定一个包含某些数字的数组 nums 和一个整数 n，找出那些在数组 nums 中缺失的数字，并将这些缺失的数字作为一个数组返回。
输入：nums = {1, 3, 5, 6}, n = 6
结果：缺失的数字是 2 和 4，因为它们没有出现在 nums 数组中。
输出：Missing numbers: 2 4
*/
    public static int[] missingNumbers(int[] nums ,int n) {
        //遍历1~n之间的数字，看在nums中是否存在。布尔类型的数组，标记是否存在，存在为true
        boolean[] present = new boolean[n+1];
        for (int num : nums) {
            present[num] = true;
        }

        //不确定有多少数字不存在，可以先用列表存放缺失的数字
        ArrayList<Integer> missing = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if (!present[i]) {
                missing.add(i);//将i加入列表
            }
        }
        //列表转成数组
        int[] res = new int[missing.size()];//数组的长度为列表的长度
        for (int i = 0; i < missing.size(); i++) {
            res[i] = missing.get(i);
        }
        return res;
    }
}